﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
//Para la conexión a la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Configuration;
using System.Drawing;
using System.Windows.Forms;

namespace Persistencia_y_capa_de_negocio
{
    public class CADNoticia
    {
        //Inicializa la instancia general
        private static readonly CADNoticia instancia = new CADNoticia();
        public static CADNoticia Instancia
        {
            get { return instancia; }
        }

        private string cadCon;     //Cadena de conexión conseguida desde app.config
        private SqlDataAdapter da; //DataAdapter
        private SqlConnection c;   //Conection
        private DataSet vdb;       //VirtualDataBase

        /// <summary>
        /// Crea una instancia e inicializa todos los componentes.
        /// </summary>
        public CADNoticia()
        {
            try
            {
                cadCon = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString;
                vdb = new DataSet();
                c = new SqlConnection(cadCon);
                da = new SqlDataAdapter("select * from noticias", c);
                da.Fill(vdb, "Noticia");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }

        /// <summary>
        /// Busca en la BD una noticia y devuelve un ENNoticia asociado.
        /// </summary>
        /// <param name="id">ID de la noticia</param>
        /// <returns>ENNoticia de la noticia con el ID indicado.</returns>
        public ENNoticia devolverNoticia(int id)
        {
            DataTable table = new DataTable();
            DataRow dataRow = null;
            string select = "id = '" + id + "'";
            table = vdb.Tables["Noticia"];
            try
            {
                dataRow = table.Select(select)[0];
            }
            catch (Exception)
            {
                return null;
            }
            ENNoticia noticia = new ENNoticia(dataRow["TITULO"].ToString(), dataRow["CUERPO"].ToString(), dataRow["RESUMEN"].ToString(), dataRow["ADMIN"].ToString());
            noticia.ID = id;
            noticia.Fecha = DateTime.Parse(dataRow["FECHA"].ToString());
            return noticia;
        }

        /// <summary>
        /// Recibe una noticia y la inserta en la BD.
        /// </summary>
        /// <param name="noticia">Noticia a insertar en la BD</param>
        public void insertarNoticia(ENNoticia noticia)
        {
            DataTable table = new DataTable();
            table = vdb.Tables["Noticia"];
            DataRow row = table.NewRow();
            row["TITULO"] = noticia.Titulo;
            row["CUERPO"] = noticia.Cuerpo;
            row["RESUMEN"] = noticia.Resumen;
            row["FECHA"] = noticia.Fecha;
            row["PUBLICADO"] = noticia.Publicada;
            row["ADMIN"] = noticia.Admin;
            table.Rows.Add(row);
            SqlCommandBuilder command = new SqlCommandBuilder(da);
            da.Update(vdb,"Noticia");
        }

        /// <summary>
        /// Recibe una noticia y la borra de la BD.
        /// </summary>
        /// <param name="noticia">Noticia a borrar de la BD</param>
        public void borrarNoticia(ENNoticia noticia)
        {
            DataTable table = new DataTable();
            table = vdb.Tables["Noticia"];
            DataRow row = table.Select("id='"+noticia.ID+"'")[0];
            row.Delete();
            SqlCommandBuilder command = new SqlCommandBuilder(da);
            da.Update(vdb,"Noticia");
        }

        /// <summary>
        /// Recibe una noticia y la actualiza sus datos en la BD.
        /// </summary>
        /// <param name="noticia">Noticia a actualizar en la BD</param>
        public void uploadNoticia(ENNoticia noticia)
        {
            DataTable table = new DataTable();
            table = vdb.Tables["Noticia"];
            DataRow row = table.Select("id='" + noticia.ID + "'")[0];
            row.BeginEdit();
            row["TITULO"] = noticia.Titulo;
            row["CUERPO"] = noticia.Cuerpo;
            row["RESUMEN"] = noticia.Resumen;
            row["PUBLICADO"] = noticia.Publicada ? 1 : 0;
            row["ADMIN"] = noticia.Admin;
            row.EndEdit();
            SqlCommandBuilder command = new SqlCommandBuilder(da);
            da.Update(vdb, "Noticia");
        }

        /// <summary>
        /// Devuelve un ArrayList con todas las noticias de la BD.
        /// </summary>
        /// <returns>Lista de noticias de la BD.</returns>
        public ArrayList getNoticias()
        {
            ArrayList lista = new ArrayList();
            DataTable table = vdb.Tables["Noticia"];
            foreach (DataRow row in table.Rows)
                lista.Add(devolverNoticia(Int32.Parse(row["ID"].ToString())));
            return lista;
        }

        /// <summary>
        /// Devuelve el número de noticias que han sido creados por el administrador que recibe por parámetro.
        /// </summary>
        /// <param name="nombre">Nombre del administrador</param>
        /// <returns>Devuelve un entero con la cantidad de noticias que han sido creados por el administrador.</returns>
        public int getNumNoticiasPorAdmin(string nombre)
        {
            DataTable t = new DataTable();
            t = vdb.Tables["Noticia"];
            try
            {
                return t.Select("admin = \'" + nombre + "\'").Count();
            }
            catch (Exception)
            {
                return 0;
            }
        }

        /// <summary>
        /// Devuelve el número de noticias que existen.
        /// </summary>
        /// <returns>Número de noticias de la BD.</returns>
        public int getNumNoticias()
        {
            DataTable t = new DataTable();
            t = vdb.Tables["Noticia"];
            return t.Rows.Count;
        }
    }
}
